﻿#ifndef _PACKAGEMANAGER_H_INCLUDE_
#define _PACKAGEMANAGER_H_INCLUDE_

#include <QObject>
#include <QHash>
#include <QMutex>
#include <QFile>
#include <QList>

struct tagPackFileHearder
{
    tagPackFileHearder()
        : fileCount(0)
    {}
    tagPackFileHearder(char *m,int fc)
        : fileCount(fc)
    {
        strcpy(mark,m);
    }

    char mark[3];           // 'P','C','K'
    int fileCount;          // 文件数量
};

struct tagPackFileChunk
{
    tagPackFileChunk()
        : startpos(0),srcfilesize(0),zipfilesize(0),fileIndex(-1)
    {
        memset(filepath,0,sizeof(filepath));
    }
    tagPackFileChunk(char *fp,qint32 sp,qint64 sfs,qint64 zfs,int fi=-1)
        : startpos(sp),srcfilesize(sfs),zipfilesize(zfs),fileIndex(fi)
    {
        strcpy(filepath,fp);
    }

    int fileIndex;          // 文件索引
    char filepath[128];     // 文件路径
    qint32 startpos;        // 开始位置
    qint64 srcfilesize;     // 原始文件长度
    qint64 zipfilesize;     // 压缩文件长度
};

class CPackageManager : public QObject
{
    Q_OBJECT

public:
    explicit CPackageManager(QObject *parent = nullptr);
    ~CPackageManager();

    /// 打包文件到包中
    bool packagingFile(QVector<QString> filepaths,QString decpath);
    /// 打开一个文件包
    bool unpackagingFile(QString decpakpath);
    /// 解压单个文件
    bool unpackagingsinglefile(QString filepath);
    /// 编辑压缩包中指定的文件
    bool editfilefrompakage(QString filename,QByteArray filedata);
    /// 得到压缩包中指定的文件
    bool getfilefrompackage(QString filename,QByteArray& filedata);
    /// 关闭文件包
    inline void closeFile(void) { if(m_unpackfile.isOpen()) m_unpackfile.close(); }
    /// 得到所有的文件信息
    inline QHash<QString,tagPackFileChunk>& getPackFileChunks(void) { return m_PackFileChunks; }
    /// 锁定文件
    inline void lockfilechunks(void) { m_MutexFile.lock(); }
    /// 解锁文件
    inline void unlockfilechunks(void) { m_MutexFile.unlock(); }
    /// 清除所有数据
    void clearalldatas(void);
    /// 设置当前工作目录
    inline void setCurrentWorkingDir(QString dir) { m_currentWorkingDir = dir; }
    /// 得到当前工作目录
    inline QString getCurrentWorkingDir(void) { return m_currentWorkingDir; }

signals:
    /// 工作进度
    void signalWorkingProcess(int currentpro,int totalpro,QString curFile);

private:
    /// 开始打包文件
    bool packagingfile(QString decpath);
    /// 打包文件到包中
    bool packagingFileData(QVector<QString> filepaths,QString decpath);
    /// 得到压缩包文件长度
    qint64 getAllpackageFileSize(void);

private:
    QMutex m_MutexFile;                                     /**< 文件包含 */
    tagPackFileHearder m_PackFileHearder;                   /**< 包文件头 */
    QHash<QString,tagPackFileChunk> m_PackFileChunks;       /**< 包文件块 */
    QList<tagPackFileChunk> m_PackFileChunkList;            /**< 包文件块列表 */
    int m_currentPro,m_totalPro;                            /**< 当前进度，总进度 */
    QString m_currentOperLog;                               /**< 当前操作日志 */
    QString m_currentWorkingDir;                            /**< 当前工作目录 */
    QFile m_unpackfile;                                     /**< 用于解压文件 */
};

#endif // PACKAGEMANAGER_H
